package com.mlh.stack;

import java.util.Deque;
import java.util.LinkedList;

/**
 * @author 缪林辉
 * @date 2024/6/28 14:27
 * @DESCRIPTION
 */
public class 最小栈 {
    // 设计一个支持 push ，pop ，top 操作，并能在常数时间内检索到最小元素的栈。
    // 实现 MinStack 类:
    // MinStack() 初始化堆栈对象。
    // void push(int val) 将元素val推入堆栈。
    // void pop() 删除堆栈顶部的元素。
    // int top() 获取堆栈顶部的元素。
    // int getMin() 获取堆栈中的最小元素。
    /**
     * Your MinStack object will be instantiated and called as such:
     * MinStack obj = new MinStack();
     * obj.push(val);
     * obj.pop();
     * int param_3 = obj.top();
     * int param_4 = obj.getMin();
     */
    //看力扣题解写出
    //利用一个辅助栈和实际栈同进同出,仅仅在push的时候做了下特殊处理，来
    // 满足辅助栈栈顶元素使实际栈中的最小元素
    Deque<Integer>stack=new LinkedList<>();
    Deque<Integer>minStack=new LinkedList<>();
    public 最小栈() {
        minStack.push(Integer.MAX_VALUE);
    }

    //方式一
    // public void push(int val) {
    //     stack.push(val);
    //     minStack.push(Math.min(val,minStack.peek()));
    // }

    // public void pop() {
    //     stack.pop();
    //     minStack.pop();
    // }

    //方式二
    public void push(int val) {
        stack.push(val);
        if(val<=minStack.peek()){
            minStack.push(val);
        }
    }

    public void pop() {
        Integer pop = stack.pop();
        if(minStack.peek().equals(pop)){
            minStack.pop();
        }
    }

    public int top() {
        return stack.peek();
    }

    public int getMin() {
        return minStack.peek();
    }

    public void push2(int val){
        stack.push(val);
        if(minStack.peek()>=val){
            minStack.push(val);
        }
    }

    public void pop2(){
        if(stack.peek().equals(minStack.peek())){//返回的值Integer类型，不能用==来做比较
            minStack.pop();
            stack.pop();
        }else{
            stack.pop();
        }
    }

    public int getMin2() {
        return minStack.peek();
    }

    public int top2() {
        return stack.peek();
    }

    public static void main(String[] args) {
        最小栈 s = new 最小栈();
        s.push2(512);
        s.push2(-1024);
        s.push2(-1024);
        s.push2(512);
        s.pop2();
        System.out.println(s.getMin2());
        s.pop2();
        System.out.println(s.getMin2());
        s.pop2();
        System.out.println(s.getMin2());
    }
}

